﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data.Sql;
using Microsoft.Practices.EnterpriseLibrary.Common;
using System.Configuration;
using Insifo.BE.Gen;


namespace Insifo.DL.Gen
{   
    public class DLDireccion : DLTransaction, IDLTransaccion<BEDireccion>
    
    {
        #region  Members

        /// <summary>
        /// Método obtiene un objeto
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>
        public BEDireccion Obtener(BEDireccion pbe)
        {
            BEDireccion be = new BEDireccion();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_GEN_Direccion_Obtener");
            dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;
            try
            {
                sqlDB.AddInParameter(dbCmd, "@ai_IdPersona", DbType.Int32, pbe.IdPersona);
                sqlDB.AddInParameter(dbCmd, "@ai_Secuencia", DbType.Int32, pbe.Secuencia);
                using (IDataReader dr = sqlDB.ExecuteReader(dbCmd))
                {
                    while (dr.Read())
                    {
                        be.TipoDireccion = DBValue.Get<string>(dr, "TipoDireccion");
                        be.Direccion = DBValue.Get<string>(dr, "Direccion");
                        be.Referencia = DBValue.Get<string>(dr, "Referencia");
                        be.IdPais = DBValue.Get<int>(dr, "IdPais");
                        be.IdDepartamento = DBValue.Get<int>(dr, "IdDepartamento");
                        be.IdProvincia = DBValue.Get<int>(dr, "IdProvincia");
                        be.IdDistrito = DBValue.Get<int>(dr, "IdDistrito");
                        be.Telefono1 = DBValue.Get<string>(dr, "Telefono1");
                        be.Telefono2 = DBValue.Get<string>(dr, "Telefono2");
                        be.Telefono3 = DBValue.Get<string>(dr, "Telefono3");
                        be.Fax = DBValue.Get<string>(dr, "Fax");
                        be.IdTipoVia = DBValue.Get<String>(dr, "IdTipoVia");
                        be.TipoVia = DBValue.Get<String>(dr, "TipoVia");
                        be.NombreTipoVia = DBValue.Get<String>(dr, "NombreTipoVia");
                        be.NroTipoVia = DBValue.Get<String>(dr, "NroTipoVia");
                        be.IdTipoZona = DBValue.Get<String>(dr, "IdTipoZona");
                        be.TipoZona = DBValue.Get<String>(dr, "TipoZona");
                        be.NombreZona = DBValue.Get<String>(dr, "NombreZona");
                        be.ReferenciaZona = DBValue.Get<String>(dr, "ReferenciaZona");
                        be.Departamento = DBValue.Get<String>(dr, "Departamento");
                        be.Interior = DBValue.Get<String>(dr, "Interior");
                        be.Manzana = DBValue.Get<String>(dr, "Manzana");
                        be.Lote = DBValue.Get<String>(dr, "Lote");
                        be.kilometro = DBValue.Get<String>(dr, "kilometro");
                        be.Block = DBValue.Get<String>(dr, "Block");
                        be.Etapa = DBValue.Get<String>(dr, "Etapa");
                        be.Estado = DBValue.Get<string>(dr, "Estado");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }


        public List<BEDireccion> Listar(BEDireccion pbe)
        {
            //DataSet ds = new DataSet();
            List<BEDireccion> lst = new List<BEDireccion>();

            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_GEN_Direccion_Listar");
            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;

                sqlDB.AddInParameter(dbCmd, "@ai_IdPersona", DbType.Int32, pbe.IdPersona);
                //sqlDB.AddInParameter(dbCmd, "@as_Direccion", DbType.String, pbe.Direccion);
                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@ai_Pagina", DbType.Int32, pbe.Pagina);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        BEDireccion be = new BEDireccion
                        {
                            IdPersona = DBValue.Get<Int32>(reader, "IdPersona"),
                            Secuencia = DBValue.Get<Int32>(reader, "Secuencia"),
                            TipoDireccion = DBValue.Get<String>(reader, "TipoDireccion"),
                            Descripcion_TipoDireccion = DBValue.Get<String>(reader, "Descripcion_TipoDireccion"),
                            Direccion = DBValue.Get<String>(reader, "Direccion"),
                            Referencia = DBValue.Get<String>(reader, "Referencia"),
                            IdPais = DBValue.Get<Int32>(reader, "IdPais"),
                            Descripcion_Pais = DBValue.Get<String>(reader, "Descripcion_Pais"),
                            IdDepartamento = DBValue.Get<Int32>(reader, "IdDepartamento"),
                            Descripcion_Dpto = DBValue.Get<String>(reader, "Descripcion_Dpto"),
                            IdProvincia = DBValue.Get<Int32>(reader, "IdProvincia"),
                            Descripcion_Prov = DBValue.Get<String>(reader, "Descripcion_Prov"),
                            IdDistrito = DBValue.Get<Int32>(reader, "IdDistrito"),
                            Descripcion_Dist = DBValue.Get<String>(reader, "Descripcion_Dist"),
                            Telefono1 = DBValue.Get<String>(reader, "Telefono1"),
                            Telefono2 = DBValue.Get<String>(reader, "Telefono2"),
                            Telefono3 = DBValue.Get<String>(reader, "Telefono3"),
                            Fax = DBValue.Get<String>(reader, "Fax"),
                            TipoVia = DBValue.Get<String>(reader, "TipoVia"),
                            NombreTipoVia = DBValue.Get<String>(reader, "NombreTipoVia"),
                            NroTipoVia = DBValue.Get<String>(reader, "NroTipoVia"),
                            TipoZona = DBValue.Get<String>(reader, "TipoZona"),
                            NombreZona = DBValue.Get<String>(reader, "NombreZona"),
                            ReferenciaZona = DBValue.Get<String>(reader, "ReferenciaZona"),
                            Departamento = DBValue.Get<String>(reader, "Departamento"),
                            Interior = DBValue.Get<String>(reader, "Interior"),
                            Manzana = DBValue.Get<String>(reader, "Manzana"),
                            Lote = DBValue.Get<String>(reader, "Lote"),
                            kilometro = DBValue.Get<String>(reader, "kilometro"),
                            Block = DBValue.Get<String>(reader, "Block"),
                            Etapa = DBValue.Get<String>(reader, "Etapa"),
                            Estado = DBValue.Get<String>(reader, "Estado"),
                            Fila = (Int32)DBValue.Get<Int64>(reader, "Fila"),
                            FilasXPagina = DBValue.Get<Int32>(reader, "FilasXPagina"),
                            TotalFilas = DBValue.Get<Int32>(reader, "TotalFilas")

                        };
                        lst.Add(be);
                    }

                }

            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                dbCmd.Dispose();
            }
            return lst;
        }

        public BEDireccion Insertar(BEDireccion pbe)
        {
            BEDireccion be = new BEDireccion();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_GEN_Direccion_Insertar");

            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;


                sqlDB.AddInParameter(dbCmd, "@ai_IdPersona", DbType.Int32, pbe.IdPersona);
                sqlDB.AddInParameter(dbCmd, "@ai_Secuencia", DbType.Int32, pbe.Secuencia);
                sqlDB.AddInParameter(dbCmd, "@as_TipoDireccion", DbType.String, pbe.TipoDireccion);
                sqlDB.AddInParameter(dbCmd, "@as_Direccion", DbType.String, pbe.Direccion);
                sqlDB.AddInParameter(dbCmd, "@as_Referencia", DbType.String, pbe.Referencia);
                sqlDB.AddInParameter(dbCmd, "@ai_IdDistrito", DbType.Int32, pbe.IdDistrito);
                sqlDB.AddInParameter(dbCmd, "@as_Telefono1", DbType.String, pbe.Telefono1);
                sqlDB.AddInParameter(dbCmd, "@as_Telefono2", DbType.String, pbe.Telefono2);
                sqlDB.AddInParameter(dbCmd, "@as_Telefono3", DbType.String, pbe.Telefono3);
                sqlDB.AddInParameter(dbCmd, "@as_Fax", DbType.String, pbe.Fax);
                sqlDB.AddInParameter(dbCmd, "@as_TipoVia", DbType.String, pbe.TipoVia);
                sqlDB.AddInParameter(dbCmd, "@as_NombreTipoVia", DbType.String, pbe.NombreTipoVia);
                sqlDB.AddInParameter(dbCmd, "@as_NroTipoVia", DbType.String, pbe.NroTipoVia);
                sqlDB.AddInParameter(dbCmd, "@as_TipoZona", DbType.String, pbe.TipoZona);
                sqlDB.AddInParameter(dbCmd, "@as_NombreZona", DbType.String, pbe.NombreZona);
                sqlDB.AddInParameter(dbCmd, "@as_ReferenciaZona", DbType.String, pbe.ReferenciaZona);
                sqlDB.AddInParameter(dbCmd, "@as_Departamento", DbType.String, pbe.Departamento);
                sqlDB.AddInParameter(dbCmd, "@as_Interior", DbType.String, pbe.Interior);
                sqlDB.AddInParameter(dbCmd, "@as_Manzana", DbType.String, pbe.Manzana);
                sqlDB.AddInParameter(dbCmd, "@as_Lote", DbType.String, pbe.Lote);
                sqlDB.AddInParameter(dbCmd, "@as_kilometro", DbType.String, pbe.kilometro);
                sqlDB.AddInParameter(dbCmd, "@as_Block", DbType.String, pbe.Block);
                sqlDB.AddInParameter(dbCmd, "@as_Etapa", DbType.String, pbe.Etapa);
                sqlDB.AddInParameter(dbCmd, "@ai_IdPais", DbType.Int32, pbe.IdPais);
                sqlDB.AddInParameter(dbCmd, "@ai_IdDepartamento", DbType.Int32, pbe.IdDepartamento);
                sqlDB.AddInParameter(dbCmd, "@ai_IdProvincia", DbType.Int32, pbe.IdProvincia);                
                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@as_UsuarioCreacion", DbType.String, pbe.UsuarioCreacion);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.IdPersona = DBValue.Get<int>(reader, "IdPersona");
                        be.Secuencia = DBValue.Get<int>(reader, "Secuencia");
                        be.FechaCreacion = DBValue.Get<DateTime>(reader, "FechaCreacion");
                        //Error
                        be.Error = DBValue.Get<Int32>(reader, "CodigoError");
                        be.Mensaje = DBValue.Get<String>(reader, "MensajeError");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }
        
        /// <summary>
        /// Método Actualiza 
        /// </summary>
        /// <returns>Devuelve una entidad</returns>
        public BEDireccion Actualizar(BEDireccion pbe)
        {
            BEDireccion be = new BEDireccion();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_GEN_Direccion_Actualizar");

            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;

                sqlDB.AddInParameter(dbCmd, "@ai_IdPersona", DbType.Int32, pbe.IdPersona);
                sqlDB.AddInParameter(dbCmd, "@ai_Secuencia", DbType.Int32, pbe.Secuencia);
                sqlDB.AddInParameter(dbCmd, "@as_TipoDireccion", DbType.String, pbe.TipoDireccion);
                sqlDB.AddInParameter(dbCmd, "@as_Direccion", DbType.String, pbe.Direccion);
                sqlDB.AddInParameter(dbCmd, "@as_Referencia", DbType.String, pbe.Referencia);
                sqlDB.AddInParameter(dbCmd, "@ai_IdDistrito", DbType.Int32, pbe.IdDistrito);
                sqlDB.AddInParameter(dbCmd, "@as_Telefono1", DbType.String, pbe.Telefono1);
                sqlDB.AddInParameter(dbCmd, "@as_Telefono2", DbType.String, pbe.Telefono2);
                sqlDB.AddInParameter(dbCmd, "@as_Telefono3", DbType.String, pbe.Telefono3);
                sqlDB.AddInParameter(dbCmd, "@as_Fax", DbType.String, pbe.Fax);

                sqlDB.AddInParameter(dbCmd, "@as_TipoVia", DbType.String, pbe.TipoVia);
                sqlDB.AddInParameter(dbCmd, "@as_NombreTipoVia", DbType.String, pbe.NombreTipoVia);
                sqlDB.AddInParameter(dbCmd, "@as_NroTipoVia", DbType.String, pbe.NroTipoVia);
                sqlDB.AddInParameter(dbCmd, "@as_TipoZona", DbType.String, pbe.TipoZona);
                sqlDB.AddInParameter(dbCmd, "@as_NombreZona", DbType.String, pbe.NombreZona);
                sqlDB.AddInParameter(dbCmd, "@as_ReferenciaZona", DbType.String, pbe.ReferenciaZona);
                sqlDB.AddInParameter(dbCmd, "@as_Departamento", DbType.String, pbe.Departamento);
                sqlDB.AddInParameter(dbCmd, "@as_Interior", DbType.String, pbe.Interior);
                sqlDB.AddInParameter(dbCmd, "@as_Manzana", DbType.String, pbe.Manzana);
                sqlDB.AddInParameter(dbCmd, "@as_Lote", DbType.String, pbe.Lote);
                sqlDB.AddInParameter(dbCmd, "@as_kilometro", DbType.String, pbe.kilometro);
                sqlDB.AddInParameter(dbCmd, "@as_Block", DbType.String, pbe.Block);
                sqlDB.AddInParameter(dbCmd, "@as_Etapa", DbType.String, pbe.Etapa);
                sqlDB.AddInParameter(dbCmd, "@ai_IdPais", DbType.Int32, pbe.IdPais);
                sqlDB.AddInParameter(dbCmd, "@ai_IdDepartamento", DbType.Int32, pbe.IdDepartamento);
                sqlDB.AddInParameter(dbCmd, "@ai_IdProvincia", DbType.Int32, pbe.IdProvincia);
                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@as_UsuarioModificacion", DbType.String, pbe.UsuarioModificacion);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.IdPersona = DBValue.Get<Int32>(reader, "IdPersona");
                        be.Secuencia = DBValue.Get<Int32>(reader, "Secuencia");
                        be.FechaModificacion = DBValue.Get<DateTime>(reader, "FechaModificacion");
                        //Error
                        be.Error = DBValue.Get<Int32>(reader, "CodigoError");
                        be.Mensaje = DBValue.Get<String>(reader, "MensajeError");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }
        
        /// <summary>
        /// Método Actualiza 
        /// </summary>
        /// <returns>Devuelve una entidad</returns>
        public BEDireccion Eliminar(BEDireccion pbe)
        {
            BEDireccion be = new BEDireccion();
            SqlDatabase sqlDB = new SqlDatabase(CadenaConexion.Obtener());
            DbCommand dbCmd = sqlDB.GetStoredProcCommand("uSP_INSIFO_GEN_Direccion_Eliminar");

            try
            {
                dbCmd.CommandTimeout = CadenaConexion.CommandTimeout;

                sqlDB.AddInParameter(dbCmd, "@ai_IdPersona", DbType.Int32, pbe.IdPersona);
                sqlDB.AddInParameter(dbCmd, "@ai_Secuencia", DbType.Int32, pbe.Secuencia);
                sqlDB.AddInParameter(dbCmd, "@as_Estado", DbType.String, pbe.Estado);
                sqlDB.AddInParameter(dbCmd, "@as_UsuarioModificacion", DbType.String, pbe.UsuarioModificacion);

                using (IDataReader reader = sqlDB.ExecuteReader(dbCmd))
                {
                    while (reader.Read())
                    {
                        be.IdPersona = DBValue.Get<Int32>(reader, "IdPersona");
                        be.Secuencia = DBValue.Get<Int32>(reader, "Secuencia");
                        be.FechaModificacion = DBValue.Get<DateTime>(reader, "FechaModificacion");
                        //Error
                        be.Error = DBValue.Get<Int32>(reader, "CodigoError");
                        be.Mensaje = DBValue.Get<String>(reader, "MensajeError");
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            finally
            {
                dbCmd.Dispose();
            }
            return be;
        }

        public BEDireccion Modificar(BEDireccion pbe)
        {
            //return _dl.Actualizar(pbe);
            BEDireccion be = null;
            if (pbe.RefAccion == BE.DbTipoAccion.Insertar)
            {
                be = Insertar(pbe);
            }
            else if (pbe.RefAccion == BE.DbTipoAccion.Actualizar)
            {
                be = Actualizar(pbe);
            }
            else if (pbe.RefAccion == BE.DbTipoAccion.Eliminar)
            {
                be = Eliminar(pbe);
            }
            return be;
        }
                #endregion  Members
    }
}
